// 309. 买卖股票的最佳时机含冷冻期
package Leetcode;

class Solution_309 {
    public int maxProfit(int[] prices) {
        // 买入记为-prices[i]，卖出记为prices[i]
        // f[i]表示截至i天的最大利益
        // f[i][0]表示第i天持有股票
        // f[i][1]表示第i天未持有股票，且处于冷冻期
        // f[i][2]表示第i天未持有股票，且未处于冷冻期
        int[][] dp = new int[prices.length][3];

        // 对0状态进行初始化
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        dp[0][2] = 0;

        for (int i = 1; i < prices.length; i++) {
            // 第i天持有股票
            // 情况一，第i-1天持有的股票，第i天没有出售
            // 情况二，第i-1天没有冷冻期，第i天买入
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][2] - prices[i]);
            // 第i天未持有股票且进入冷冻期
            // 只有一种可能，第i-1天持有股票，第i天卖出
            dp[i][1] = dp[i - 1][0] + prices[i];
            // 第i天未持有股票且未进入冷冻期
            // 情况一，第i-1天未持有股票且进入冷冻期，则第i天无法买入卖出
            // 情况二，第i-1天未持有股票且未进入冷冻期，第i天仍然未进行操作
            dp[i][2] = Math.max(dp[i - 1][1], dp[i - 1][2]);
        }

        return Math.max(dp[prices.length - 1][1], dp[prices.length - 1][2]);
    }
}